
package control;


import java.io.BufferedReader;
import java.io.EOFException;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import modelos.Dato;
import modelos.DatosBarras;
import modelos.DatosFuncion;
import modelos.DatosPie;

/**
 * Lee del archivo indicado por el usuario los datos de la grafica indicada por
 * el usuario y prepara los datos para dibujar la gráfica.
 * @author Rafael Carrillo 90465
 */
public class Control {
   private BufferedReader br=null;
   
   private JPanel lienzo;
   private File file;
   private FileReader fReader;
   private JFrame frame;
   private int tipo;
   private DatosBarras barras;
   private DatosFuncion funcion;
   private DatosPie pie;
   
   
    /**
    * Inicializa los objetos frame,lienzo y jfc para su manipulacion dentro de ésta clase
    * e indica que tipo de gráfica es la que se va a dibujar.
    * @param frame Frame donde se está mandando a llamar a ésta clase.
    * @param lienzo JPanel proveniente del frame
    * @param jfc JFileChooser con la informacion del archivo a procesar
    * @param tipo Tipo de Grafica a procesar (FUNCION,BARRAS,PIE).
    */
    public Control(JFrame frame,JPanel lienzo,JFileChooser jfc,int tipo){
        //file=jfc.getSelectedFile();
        file=jfc.getSelectedFile();
        this.lienzo=lienzo;
        this.frame=frame;
        this.tipo=tipo;
        openFile();
    }
    
    /**
     * Abre el archivo de Texto proveniente del JFileChooser, ejecuta el metodo
     * getDatos para obtener los datos del archivo.
     */
    private void openFile(){
        try{
        fReader=new FileReader(file);
        }catch(IOException io){
            JOptionPane.showMessageDialog(frame,"Error al abrir el Archivo");
            System.out.println("Error al abrir el Archivo: "+file.getAbsolutePath());
            return;
        }
        br=new BufferedReader(fReader);
        System.out.println("Archivo abierto: "+file.getAbsolutePath());
        getDatos();
    }
    /**
     * Obtiene los datos del archivo abierto, debe ser un archivo en un formato
     * válido, de lo contrario lanzará un error.
     */
    private void getDatos(){
        if (br==null)
            return;
        switch(tipo){
            case 1: //Funcion
                try{
                String titulo=br.readLine();
                String tituloX=br.readLine();
                String tituloY=br.readLine(); 
                int numPuntos=Integer.parseInt(br.readLine());

                double[][]puntos=new double[numPuntos][2];
                for(int i=0;i<numPuntos;i++){
                    try{
                        String[] tmp=br.readLine().split(", ");
                        puntos[i][0]=Double.parseDouble(tmp[0]);
                        puntos[i][1]=Double.parseDouble(tmp[1]);
                    }catch(EOFException eof){
                        JOptionPane.showMessageDialog(frame,"Error al obtener los datos, revise el archivo "
                                + file.getAbsolutePath());
                        break;
                    }
                }
                funcion=new DatosFuncion(titulo, tituloX, tituloY, puntos);
                //drawFunction(funcion);
                }catch(IOException ioe){
                    JOptionPane.showMessageDialog(frame, "Error al leer el archivo de graficas");
                    break;
                }catch(Exception e){
                    JOptionPane.showMessageDialog(frame, "El archivo tiene un formato incorrecto");
                    e.printStackTrace();
                }
                break;
                
            case 2: //Barras
                try{
                    String titulo=br.readLine();
                    String tituloX=br.readLine();
                    String tituloY=br.readLine(); 
                    int numeroDatos=Integer.parseInt(br.readLine());
                    Dato[]datos=new Dato[numeroDatos];
                    for(int i=0;i<numeroDatos;i++){
                        String []dato=br.readLine().split(", ");
                        datos[i]=new Dato(dato[0],Double.parseDouble(dato[1]));
                    }
                    barras=new DatosBarras(titulo, tituloX, tituloY, datos);
                    break;
                }catch(IOException ioe){
                    JOptionPane.showMessageDialog(frame, "Error al leer el archivo de graficas");
                    break;
                }catch(Exception e){
                    JOptionPane.showMessageDialog(frame, "El archivo tiene un formato incorrecto");
                    e.printStackTrace();
                }
            case 3: //pie
                try{
                    String titulo=br.readLine();
                    boolean normalizado=true;
                    if(!(br.readLine().equalsIgnoreCase("normalizado")))
                        normalizado=false;
                    int numeroDatos=Integer.parseInt(br.readLine());
                    Dato[]datos=new Dato[numeroDatos];
                    for(int i=0;i<numeroDatos;i++){
                        String []dato=br.readLine().split(", ");
                        datos[i]=new Dato(dato[0],Double.parseDouble(dato[1]));
                    }
                    pie=new DatosPie(titulo, datos, normalizado);   
                    break;
                }catch(IOException ioe){
                    
                }catch(Exception e){
                    JOptionPane.showMessageDialog(frame, "El archivo tiene un formato incorrecto");
                    e.printStackTrace();
                }
        }
    }
    /**
     * Llama a los distitntos metodos para dibujar en el JPanel la grafica 
     * deseada que coincida con el tipo del constructor.
     * 
     */
    public void draw(){        
        switch(tipo){
            case 1://grafica de funcion
                if (funcion!=null){
                    Grafica graficador=new Grafica(tipo,lienzo,funcion);
                    graficador.graficaFuncion();
                }
                break;
            case 2:
                if (barras!=null){ //Grafica de Barras
                    Grafica graficador=new Grafica(tipo,lienzo,barras);
                    graficador.graficaBarras();
                }                    
                break; 
            case 3:
                if(pie!=null){ //Grafica de Pie
                    Grafica graficador=new Grafica(tipo,lienzo,pie);                    
                    graficador.graficaPie();
                }
                break;
            default:
                JOptionPane.showMessageDialog(frame,"No has cargado ninguna grafica");
        }
    }
    
}
